<?php

namespace app\common\command;
use OSS\OssClient;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Db;
use Yansongda\Pay\Exceptions\Exception;

class VideoCommand extends Command
{
    protected function configure()
    {
        $this->setName('videoCommand')->setDescription('视频转化');
    }

    protected function execute(Input $input, Output $output)
    {

        $ossUrl = 'https://happygoma.oss-cn-hongkong.aliyuncs.com/uploads/movie/duanju003/jieyao01.mp4'; // 替换为您的输入MP4文件路径\
//        $ossUrl = '/data/videos/ces.mp4'; // 替换为您的输入MP4文件路径
        $outputDir = '/data/videos/ceshi'; // 替换为您希望输出m3u8和ts文件的目录
        dump($outputDir);
        $this->convertAndUploadToOss($ossUrl, $outputDir, 10);// 每片10秒
//        dump($success);exit();
    }
    /**
     * 使用FFmpeg将MP4视频转换为HLS m3u8格式及ts分片
     * @param string $inputFile 输入MP4文件的完整路径
     * @param string $outputDir 输出m3u8和ts文件的目录路径
     * @param int $segmentTime 每个ts分片的时长（单位：秒），默认10秒
     * @param string $ffmpegPath FFmpeg可执行文件的路径，默认为 'ffmpeg'（假设已在系统PATH中）
     * @throws Exception 当执行失败时抛出异常，包含错误信息
     */
    public function convertAndUploadToOss($inputUrl, $outputDir, $ossTargetDir, $segmentTime = 10, $ffmpegPath = 'ffmpeg') {
        // 1. 确保输出目录存在且可写
//        dump(mkdir($outputDir, 0755, true));exit();
        if (!is_dir($outputDir) && !mkdir($outputDir, 0755, true)) {
            throw new Exception("无法创建输出目录: " . $outputDir);
        }

        // 2. 构建FFmpeg命令
//        $outputM3u8 = $outputDir . '/index.m3u8';
//        $outputTsPattern = $outputDir . '/video/video-%03d.ts';


//        $str="ffmpeg4 -y -i $inputUrl -vcodec copy -acodec copy -vbsf h264_mp4toannexb $outputDir/output.ts";

        $str="ffmpeg4 -i $outputDir/output.ts -c copy -map 0 -f segment -segment_list $outputDir/index.m3u8 -segment_time 20 $outputDir/video-%03d.ts";
        system($str,$res);

        echo $res;exit();

//        system($str,$res);


        $command = "ffmpeg3 -i $inputUrl -c:v libx264 -c:a aac -strict -2 -hls_time 3 -hls_list_size 0 -hls_segment_filename $outputTsPattern $outputM3u8";
        // 执行命令
        exec($command, $output, $return_var);
        // 构建命令 - 直接使用远程URL作为输入
        $cmd = sprintf(
            '%s -i "%s" -c:v libx264 -c:a aac -strict -2 -f hls -hls_time %d -hls_list_size 0 -hls_segment_filename "%s" "%s" 2>&1',
            $ffmpegPath,
            $inputUrl,
            $segmentTime,
            $outputTsPattern,
            $outputM3u8
        );

        // 3. 执行命令并捕获输出
        $output = [];
        $returnCode = 0;
        exec($cmd, $output, $returnCode);

        // 4. 检查执行结果
        if ($returnCode !== 0) {
            echo "FFmpeg执行失败 (返回码: $returnCode): ";
            exit();
//            throw new Exception("FFmpeg执行失败 (返回码: $returnCode): " . implode("\n", $output));
        }

        // 5. 检查输出文件是否生成
        if (!file_exists($outputM3u8)) {
            echo "转换失败，未生成m3u8索引文件。FFmpeg输出: ";
            exit();
        }
        dump($returnCode);
    }
}
